#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
using namespace std;
//
//typedef class string_1
//{
//private:
//      char *str;
//      int len;
//      static int num_string;   //记录new了多少内存，最后释放完没
//
//public:
//      string_1(const char *t);
//      string_1();      //当程序中没有构造函数的时候，编译器会提供默认构造函数，但是默认构造函数是不做任何操作的。
//      ~string_1();
//      friend ostream & operator<<(ostream &os, const string_1 &st);
//}st_1;
//
//
//int string_1::num_string = 0;    //static是每个对象所共有的
//
//
//string_1::string_1()
//{
//      len = 4;
//      str = new char(len + 1);
//      strcpy(str,"C++");
//      num_string++;
//      cout << str << endl;
//}
//
//
//string_1::string_1(const char *s)
//{
//      len = strlen(s);
//      str = new char[len + 1];
//      strcpy(str, s);
//      num_string++;
//      cout << str << "                 sss" << endl;
//}
//
//
//string_1::~string_1()
//{
//      num_string--;
//      cout << "number :" << num_string << endl;
//      delete[] str;
//
//}
//
//ostream & operator <<(ostream &os, const string_1 &st)
//{
//      os << st.str;     //ostream类的引用
//      return os;
//}
//
#define Q_SIZE 10    //队列大小，即节点数
//顾客类
typedef class customer
{
protected:
        long arrive;         //
        int processtime;     //记录顾客所花费的时间
public:
        customer()
        {
               arrive = processtime = 0;
        }
        void sssset(long when);    //声明了，但是没有定义
        long when()const
        {
               return arrive;
        }
        int ptime() const
        {
               return processtime;
        }
}Item;
//排队队列
typedef class jz_queue
{
private:
        typedef struct Node   //本质上也是一个变量,用于产生节点，一个结构体就是一个节点
        {
               Item item;              //顾客对象，形成队列
               struct Node * next;     //用于指向下一个节点
        }ND;   //节点内部的成员结构
        ND *front;           //头节点地址
        ND *rear;            //尾节点地址
        int items;           //记录节点数
        const int qsize;     //对列大小
public:
        jz_queue(const jz_queue &q) :qsize(0) {}    //const 只能有这种方式的构造函数进行初始化
        jz_queue & operator=(const jz_queue &q)
        {
               return *this;
        }
        jz_queue(int qs = Q_SIZE);
        ~jz_queue();
        bool isempty()const;               //判断队列是否为空
        bool isfull()const;                //判断队列是否满了
        int queuecount()const;             //记录当前队列节点数目
        bool enqueue(const Item &item);    //进队
        bool dequeue(Item &item);          //出队
}jz_q;








#include "include_1.h"
jz_queue::jz_queue(int qs) :qsize(qs)
{
        front = NULL;
        rear = NULL;
        items = 0;
}
jz_queue::~jz_queue()
{
        Node *temp;
        while (front != NULL)    //说明队列里面有成员
        {
               temp = front;
               front = front->next;    //头节点后移
               delete temp;  //释放原先头节点的地址
        }
}
bool jz_queue::isempty()const   //判断队列是否为空
{
        return items == 0;    //if(item == 0)return 1 else return 0;
}
bool jz_queue::isfull()const    //判断队列是否满了
{
        return items == qsize;     //if(item == qsize)return 1 else return 0;
}
int jz_queue::queuecount()const   //当前队列节点数目
{
        return items;
}
bool jz_queue::enqueue(const Item &itme)   //进队 itme新增节点的数据
{
        if (isfull())
        {
               return false;      //说明队列是空的，不能进队
        }
        //开辟新节点的空间
        ND *add = new ND;   //struct queue *num =  (struct queue *)malloc(sizeof(queue));
        add->item = itme;
        add->next = NULL;   //进队是在链表尾插入节点，所以节点指向空
        items++;     // 记录当前节点数目
        if (front == NULL)   //当队列没有节点的时候
        {
               front = add;   //新增的节点作为队头
        }
        else
               rear->next = add;  //否则队尾指针指向新增节点，用作队尾
            rear = add;     //rear后移一位
               return true;   
}
bool jz_queue::dequeue(Item &item)   //出队,形参用于接收队头的的数据
{
        if (front == NULL)    //判断队列里面是否有节点
        {
               return false;
        }
        item = front->item;
        items--;
        //接收头部地址的指针因为没有开辟空间，所以下面的语句是把队列头部的地址
        //给temp 则这时有两个成员可以操控头部地址
        ND *temp = front;    //定义一个指针，用于接收头部地址
        front = front->next; //头部向后移
        delete temp;   //删除头部节点
        if (isempty())
        {
               rear->next = NULL;  //当队列为空的时候，队尾指向空
        }
        return true;
}
void Item::sssset(long when)
{
        processtime = rand() % 3 + 1;
        arrive = when;
}





#include "include_1.h"
int main()
{
        /*{
               st_1 line1("Celery Stalks at Mindnight");
               st_1 line2("Lettuce Prey");
               st_1 line3("Spinach");
               cout << line1 << endl;
               cout << line2 << endl;
               cout << line3 << endl;
               string_1 sailor = line3;
               cout << sailor << endl;
               st_1 kind;
               kind = line3;
               cout << kind << endl;
        }*/
        system("pause");
        return 0;
}